第2週 型と演算子
本日の内容
前回の復習
変数と型
演算子
前回の復習
code:InTheWorld.c
int main() {
printf("世の中には\n");
return 0;
}
好きな数字にnumという変数名をつけ、それを出力してください
code:num.c
int main() {
int num = 57;
printf("%d\n", num);
return 0;
}
変数と型
前週3-1のように変数を使うことで、値に名前をつけることができます。しかし、値の種類(型)によって変数の種類を変える必要があります.
table: 型の種類(一部)
型名 説明 有効範囲 フォーマット指定子
int (符号付き)整数 -2147483648~2147483647 %d
float 単精度浮動小数点 (絶対値)3.4e-38~3.4e38 %f
double 倍精度浮動小数点 (絶対値)1.7e-308~1.7e308 %lf
char 文字 -128~127 %c
使い方
code:how_to_use_float.c
int main() {
float num = 57.25;
printf("%f\n", num); // 57.250000
return 0;
}
printfのフォーマット指定子は型によって異なります。たとえばfloatの場合は%fを用います。 文字型は'a'のようにその文字をシングルクォートではさむことで表記します。
code:char.c
int main() {
char c = 'a';
printf("%c\n", c); //a
}
変数は=(代入演算子)を用いることでその値を変更することができます。
代入できる値はその変数の型と同じ型に属する値だけになります。
code:assign.c
int main() {
int num = 3;
num = 10; //num変数に10を代入
printf("%d\n", num); // 10
return 0;
}
代入を行う際の右辺の式には、代入前の同じ変数を使うこともできます。
code:assign.c
int main() {
int num = 3;
num = num + 7; //num変数に(num+7)の値である10を代入
printf("%d\n", num); // 10
return 0;
}
変数を「宣言」する場合、最初から値が入っている必要はありません。
code:assign.c
int main() {
int num; //変数の宣言
num = 3; //3を代入
printf("%d\n", num); // 3
return 0;
}
キャスト
変数、値は別の型の変数に変換することができます、それをすることを「キャスト」と呼びます。
キャストをするときは、キャストしたい値の前に(キャスト後の型)とします。
code:assign.c
int main() {
int num1 = 1;
float num2 = (float) num1;
printf("%f\n",num2); //1.000000
return 0;
}
数値間以外でもキャストをすることができます。
code:assign.c
int main() {
int num1 = 90;
char num2 = (char)num1;
printf("%c\n",num2); //Z
return 0;
}
暗黙の型変換
変数に値を代入するときにその変数の型と値の型が一致していない場合、何も指定しなくても値は変数の型に強制的にキャストされます。これを暗黙の型変換と呼びます。
例えば、変数がintで値がfloatの場合、小数点以下を切り捨てて代入されます。
code:typeCoercion.c
int main() {
int num = 2.55;
printf("%d\n", num); // => 2
}
演算子
演算子とは、コンピュータに「演算」の命令を与えるための記号です。基本的に同じ型でしか演算を行うことができません。
table:算術演算子
演算子 使い方 名称または読み方 結果
+ x+y (プラス) xとyの和
- x-y (マイナス) xとyの差
* x*y (アスタリスク) xとyの積
/ x/y (スラッシュ) xをyで割った商
% x%y mod演算子 xをyで割った余り
例(演算子を含んだ式は勿論四則演算の優先順位が適用される)
code:arithmetic_operator.c
int main() {
int num = 3 * 4 - 4 / 4; //12 - 1
num = num % 2; // 11 % 2
printf("%d\n", num); // => 1
}
除算に関しては、intとfloatの違いにとくに気をつける必要があります。
code:div.c
int main() {
float x = 6 / 5;
printf("%f\n", x); //=> 1.000000
x = 6 / (float)5; // x = 6 / 5.0
printf("%f\n", x); //=> 1.200000
}
table:比較演算子・論理演算子
== x==y (イコール) xとyが一致しているか
!= x!=y (ノットイコール) xとyが異なっているか
< x<y (小なり) x<yか
<= x<=y (小なりイコール) x<=yか
x>y (大なり) x>yか
= x>=y (大なりイコール) x>=yか
&& x&&y 論理AND演算子 x AND y
|| x||y 論理OR演算子 x OR y
! !x 論理否定演算子 NOT x
table:代入演算子
= x = 42 代入演算子 xに42を代入
table:複合代入演算子(算術演算と代入を同時にします)
演算子 仕様例 意味 意味が同じ代入式
+= x+=5 xにx+5を代入 x = x + 5
++ x++ xにx+1を代入 x = x + 1
-- x-- xにx-1を代入 x = x - 1
-= x-=5 xにx-5を代入 x = x - 5
*= x*=2 xにx*2を代入 x = x * 2
/= x/=2 xにx/2を代入 x = x / 2
%= x%=3 xにx%3を代入 x = x % 3
例
code:assignCalcOperator.c
int main() {
int i = 0;
i++;
printf("%d\n", i); //=>1
i *= 8;
i -= 3;
printf("%d\n", i); //=>5
i %= 5;
i--;
printf("%d\n", i); //=>-1
}
その他、bit演算子などもあります。ここで紹介していない演算子もあります。 第二週のまとめ
変数を使うときは、初めに型を宣言する必要があります。
型には種類があり、代入する値によって変えなければなりません。
プログラム内の値に対して演算をするときには演算子を使い、数式と同じ書き方をします。
次回までにやってくること
練習問題
このページに載っている演算子を使った式を構築し、出力してください。(一通り試しましょう)
char型の文字の変数を宣言した後に、その変数をint型でキャストした値を表示してください。また、なぜそうなるのか考察してください。
挑戦問題
defineマクロというものがあります。#define max(x, y) x>y?x:y とプログラムの始めの方に定義することでそれ以降のプログラム中でmax(任意の式e1, 任意の式e2)が出てきた場合e1>e2?e1:e2に置換されます。
高橋君は次のプログラムを書きましたが正常に動作しませんでした。
code:sample.c
int main() {
int a = 5;
int b = 5;
int c = max(++a, b);
printf("%d\n", c);
}
このプログラムはaの値6を出力するものと思われましたが、なぜか別の値が出力されてしまいます。どんな値になるかを実行して確かめ、その値になってしまう理由を考察してください。
検索キーワード
関数マクロ
マクロの健全性(かなり深いところまで調べたい人向け)
sizeof演算子について調査してください。
余談
上に挙げた、"how_to_use_float.c"では、最初にnumに代入した値によってはprintfで表示した結果にずれがある場合があります。そのあたりの話